Skip to content

Jenkins

Jenkins

image-20230320203016197

目录

[toc]

本节实践

实战名称
💘 实践:创建自由风格流水线-2023.3.21(测试成功)
💘 实践:自定义agent通信端口-2023.3.21(测试成功)
💘 实践:Jenkins配置node方法-2023.3.21(测试成功)
💘 实践:如何在流水线构建的时候使用页面参数-2023.3.22(测试成功)
💘 实践:pipeline里调shell的方式-2023.3.22(测试成功)
💘 实践:流水线回放功能-2023.3.22(测试成功)
💘 实践:pipeline里配置丢弃历史构建-2023.3.22(测试成功)
💘 实践:pipeline中字符参数和选项参数-2023.3.22(测试成功)
💘 实践:pipeline里配置远程构建-2023.3.22(测试成功)
💘 实践:Jenkins项目分类-2023.3.23(测试成功)
💘 实践:Jenkins 凭据管理-2023.3.25(测试成功)
💘 实践:Jenkins BlueOcean安装-2023.3.25(测试成功)

简介

image-20230319103340484

jenkins 概述:是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

对于持续集成工具现在也有很多,目前应用最多的是Jenkins

  • Jenkins前身是Hudson使用java语言开发的自动化发布工具。

  • Jenkins是跨平台的可以在Win、Linux、MacOS部署。

  • Jenkins是应用最广的开源免费的持续集成服务器,企业中普遍使用Jenkins来作为项目集成发布工具

  • Jenkins官方提供的插件使Jenkins更为强大

目前发展超过17年,比较成熟的CI工具(也可以CD)能够实现自动化集成发布。目前普遍使用Jenkins完成持续集成CI/持续部署CD等相关技术实践。 可以把Jenkins想象成一个脚本执行器,我们可以通过编写代码的方式灵活的控制Jenkins作业的运行与控制。

⚠️ 注意:插件是jenkins的一大优势,也是其一大弊端。Jenkins的另外一个特点(也是存在缺陷的地方),功能比较齐全是因为有丰富的插件库。基本上有1-2千个可以使用的插件。这些插件对可以无限的去扩展Jenkins一些功能

1.推荐按需使用。尽量少装一些插件。为什么呢?当以后jenkins越来越大,任务越来越多时,如果插件很多,可能在重启jenkins后会因一些插件问题而导致jenkins无法启动。 (如果插件过多没有更新管理。当在Jenkins更新的时候可能会因为插件的原因导致) 2.能不用插件实现的尽量不要使用插件!可以写一些代码来实现,这样可以减少插件的依赖。另外一点,对你的技能提升也是有很大的帮助。

Jenkins是企业里面应用最广的、开源的持续集成系统。在企业里面不管是中小型企业还是大型企业,甚至有一些专门做DevOps的厂商也在基于Jenkins来做CI/CD平台。Jenkins是开源免费的,用java语言开发的CI/CD系统。可以用Jenkins来做CI也可以用来做CD。Jenkins本质上是用来做任务的编排和可视化的一套工具。

回想18年的时候我们还在大量使用**自由风格(freestyle)**类型的项目,并没有使用Pipeline特性。 而目前Jenkins大量应用Pipeline类型的项目来进行作业构建。Pipeline类型的项目是可以通过代码进行描述的。可以通过Pipeline+Groovy对Jenkins延伸扩展,例如可以直接导入Groovy的package对Jenkins Pipeline扩展。所以使用这种模式我们将不再关心有没有实现哪些功能插件了,而是直接编写特性代码来实现功能。

⚠️ master本身也具有作业构建的能力,但是一般我们用master节点作为调度。master节点不做构建,它只是用来存储这些任务。真正构建的时候,我们在agent上构建。我们做测试的时候,可能会用master节点来做一些任务。但是实际生产环境中,我们绝对不能用master节点去构建任务。因为任务一旦多了,会影响jenkins性能,导致你直接宕机了。

Jenkins的特点:开源免费、安装简单。主从的分布式架构,分为Server和Agent。 Server主要是负责作业调度,Agent是Pipeline真正运行的节点。 (此处类似于Kubernetes的架构,尽量不要在主控节点运行任务)

可视化的管理页面:通过UI管理页面对Jenkins系统进行配置管理。 BlueOcean更加简洁和漂亮的UI页面。

Jenkins2.0核心特性:Pipeline As Code,以代码的方式描述流水线作业。特别适合大规模下的流水线复用,即多条流水线使用相同一套流水线模板。

训练营中最重要的一部分就是Jenkins PIpeline As Code,是最核心的内容。 Pipeline + Groovy YYDS!

Groovy这门语言其实与Python编程语言语法上很类似。

数据目录管理

image-20230320203252325

  • Jenkins采用本地文件的数据存储方式;

  • Jenkins的所有数据都存储在JENKINS_HOME变量定义的数据目录下;

  • 默认JENKINS_HOME的值是**/var/lib/jenkins**;

  • 注意:jenkins_home

bash
jenkins把所有的数据都存放在了文件系统里面。rpm方式安装的jenkins:其家目录在/var/lib/jenkins目录下;#注意docker方式安装的jenkins:其家目录在/var/jenkins_home目录下;jenkins所有的配置文件都是以.xml格式存储的!

docker方式安装的jenkins:

bash
[root@Devops6 ~]#docker exec -it jenkins bashjenkins@d6139736ef4c:/$cd/var/jenkins_home/jenkins@d6139736ef4c:~$lsconfig.xmlhudson.model.UpdateCenter.xmljenkins.install.InstallUtil.lastExecVersionjenkins.model.JenkinsLocationConfiguration.xmljobsnodeMonitors.xmlpluginssecret.keysecretsuserContentwarcopy_reference_file.logidentity.key.encjenkins.install.UpgradeWizard.statejenkins.telemetry.Correlator.xmllogsnodesqueue.xml.baksecret.key.not-so-secretupdatesusersjenkins@d6139736ef4c:~$

jenkins容器对应宿主机数据目录位置:

bash
[root@Devops6 ~]#cd /data/devops6/jenkins_home/[root@Devops6 jenkins_home]#lsconfig.xmlhudson.model.UpdateCenter.xmljenkins.install.InstallUtil.lastExecVersionjenkins.model.JenkinsLocationConfiguration.xmljobsnodeMonitors.xmlpluginssecret.keysecretsuserContentwarcopy_reference_file.logidentity.key.encjenkins.install.UpgradeWizard.statejenkins.telemetry.Correlator.xmllogsnodesqueue.xml.baksecret.key.not-so-secretupdatesusers

image-20230320204032066

Jenkins启动后会读取JENKINS_HOME变量,根据次变量的值来决定数据存储的位置。Jenkins是以XML格式的文件存储到数据目录。

image-20230320204101715

注意:我们以后做集成的时候,会经常和这个config.xml文件打交道。

但是需要注意的是,这里有个坑,在做集成前,一定要对这个文件做个备份。万一在做用户权限时,不小心把自己权限给设置错了,此时就需要用到这个文件来救场了。

Jenkins目录的用途:

  • caches:系统缓存数据
  • jobs: Jenkins项目作业
  • nodes: Jenkins slave节点信息
  • secrets: 秘钥信息
  • userContent: 类似于web站点目录,可以上传一些文件 (这里可以放一个index.html文件,然后它会给你展示出来!类似于sftp功能,用的不是很多!)
  • workspace: 默认的工作目录
  • fingerprints: 指纹验证信息
  • logs : 日志信息
  • plugins: 插件相关配置
  • updates: 插件更新目录
  • users: jenkins系统用户目录

⚠️ 注意:

workspace :默认的工作目录

一般要把这个工作目录和jenkins的数据目录要分开存放,要不万一你这个目录io比较高的话,也会对jenkins有影响!

这个目录非常重要,就是我们以后运行的每一个流水线作业,它是在哪里工作,是在这个workspace目录下工作的!

默认情况下,这个workspace目录也是在jenkins_home下,但是我们一般是去自定义这个目录的!

Jenkins项目类型-Pipeline

image-20230321061113967

  • 参数化构建: 为流水线传参
    • String 字符参数
    • Choice 选项参数
  • 历史构建管理
    • 丢弃历史构建: 保留 5天内 10个构建
  • 并行构建控制

范例:创建自由风格流水线

==💘 实践:创建自由风格流水线-2023.3.21(测试成功)==

接下来我们新创建1条流水线:

默认是自由风格类型流水线;(如果要创建Pipeline类型流水线,则需要安装pipeline插件才行。)

  • 创建自由风格流水线

点击+New Item

image-20230321061616399

填写item name,点击ok

image-20230321061700151

此时,一个自由风格的流水线项目就被创建成功了,接下来,我们只需要填写一些配置参数就好:

image-20230321062229200

  • 配置参数

全局配置:

  • 丢弃旧的构建

image-20230321062751943

  • 参数化构建

image-20230321062904129

image-20230321063014612

image-20230321063525794

  • 并行构建控制

image-20230321063610564

  • Build:

image-20230321064006336

完成后,点击Save

点击Build with Parameters

image-20230321064111128

填写构建版本 和构建环境,点击Build

image-20230321064146238

可以看到构建成功被完成了:

image-20230321064207635

image-20230321064220475

测试结束。😘

范例:创建pipeline流水线

==💘 实践:创建pipeline流水线-2023.3.21(测试成功)==

  • 在使用Pipeline类型的项目时,需要提前安装Jenkins的Pipeline插件。

点击管理Jenkins-管理插件

image-20230321064440995

Availabe里查找pipeline插件,完成安装:

image-20230321064601766

image-20230321064626775

  • 安装好插件后新建一个Pipeline类型的作业:

image-20230321065652562

🍊 自由风格和pipeline风格的区别

  • 自由风格项目和Pipeline类型的项目区别是:自由风格项目构建部分的操作都是在页面上面完成的,而Pipeline的构建任务描述都是通过代码的方式。

自由风格:

image-20230321065819755

pipeline风格:

image-20230321070114158

但自由风格入门可能简单一点,这些配置我们都可以在这里选择,基本上,这一条流水线就调好了。

image-20220415151732956

范例:安装Stage View插件

注意:之前老版本在安装好Pipeline插件后,会一起安装Stage View插件的

但是当前新版本jenkins/jenkins:2.346.3-2-lts-jdk11,安装好Pipeline插件后,是不会一起安装Stage View插件的,因此需要我们单独安装此插件才行。

  • 未安装Stage View插件前

image-20230407070129956

  • 安装Stage View插件后

image-20230407070559350

范例:pipeline中字符参数和选项参数

==💘 实践:pipeline中字符参数和选项参数-2023.3.22(测试成功)==

选项参数和字符参数是我们用的最多的!

  • 同样,我们按照上面自由风格类型填写字符串参数,选项参数等配置

参数化构建是可以满足不同情况下我们可以在流水线运行前填写参数传递。这些参数会在构建流水线的页面展示。

如果我们需要填写一个具体的值,我们可以用字符参数。如果已经确定值的可选范围可以使用选项参数供用户选择。

image-20230321070308320

image-20230321070321638

  • 进行构建

image-20230321070626570

image-20230321070654198

image-20230321070712280

pipeline里配置丢弃历史构建

==💘 实践:pipeline里配置丢弃历史构建-2023.3.22(测试成功)==

  • Jenkins每一次构建都会生成对应的构建日志数据。进行大规模编译会有许多日志,占用磁盘空间。我们可以选择性的保留周期内的构建信息,例如:1个月内的10次构建。具体的保留日期可以参考项目的发布周期。

image-20230321070246462

  • 进行多次构建并查看效果:发现这边只有最近的10次构建记录

image-20230322071740300

pipeline里配置并行构建

  • 并发构建选项,可以控制项目是否支持多次并行的构建。按照实际的场景进行选择。(默认就是开启并行构建的(只是一个选项配置而已))

image-20230321070545030

如何在流水线构建的时候使用页面参数(3种方)

==💘 实践:如何在流水线构建的时候使用页面参数-2023.3.22(测试成功)==

定义的参数可以通过${params.NAME}的方式使用。

其实在Jenkins运行时这些参数也会注入到env这个对象中,也可以通过${env.NAME}或者${NAME}

image-20230321071034214

groovy
pipeline {agent anystages {stage('Hello') {steps {echo 'Hello World'echo "${VERSION}"echo "${env.VERSION}"echo "${params.VERSION}"}}}}

image-20230321071104522

pipeline里调shell的方式

==💘 实践:pipeline里调shell的方式-2023.3.22(测试成功)==

image-20230321073644974

groovy
pipeline {agent anystages {stage('Hello') {steps {echo 'Hello World'echo "${VERSION}"echo "${env.VERSION}"echo "${params.VERSION}"sh "ls -l"}}}}

注意:这里的引号一定要是双引号。

image-20230321073701989

流水线回放功能

==💘 实践:流水线回放功能-2023.3.22(测试成功)==

  • 使用回放功能测试代码

image-20230321074326744

image-20230321074353464

image-20230321074428691

另外,在回放里测试的代码是不会保存到自己的流水线代码里的,要记得及时保存代码哦。

⚠️ 注意:

如果某次的构建失败了的话,那么本次回放是不可用的,即上次的代码会丢失!(注意:推荐在本地编辑器编辑代码,然后复制到回放中就好)

image-20220420075928437

image-20220420080126050

Jenkins项目构建方式

image-20230321061154278

  • 定时构建:到具体时间进行触发。
  • API 触发构建
  • 与其他系统联动
    • Gitlab提交代码后通过webhook触发构建(主动)
    • Jenkins 轮训Gitlab检测到代码变更触发构建(被动)

image-20230321063742284

image-20230321063913332

==💘 实践:pipeline里配置远程构建-2023.3.22(测试成功)==

远程构建:配置一个认证token,触发时必须带有token才行。

image-20230322075548160

触发命令:

bash
#触发curl-uadmin:adminhttp:#触发并传递参数curl-uadmin:admin"http:defcommon =neworg.devops.Common()users =[["id":1,"name":"jenkins1"],["id":2,"name":"jenkins2"],["id":3,"name":"jenkins3"],]pipeline {agent anystages{stage("Test"){steps{script{echo "src output demo"name =common.GetUserNameByID(users,1)print(name)echo "vars output demo"name =GetUserName(users,2)print(name)echo "get resources"data =libraryResource 'config/config.json'println(data)data_json =readJSON text:dataprintln(data_json["id"])}}}}}
  • 运行

image-20230411170538769

Jenkins排错

TS:pipline里代码语法写错排查方式-2023.3.22(已解决)

1、错误代码

image-20230322064607842

groovy
currentBuild.dispalyName ="Devops:commitID"#这里的displayName写成dispalyName了……currentBuild.description ="Branch:master"pipeline {agent anystages {stage('Hello') {steps {echo 'Hello World'echo "${VERSION}"echo "${env.VERSION}"echo "${params.VERSION}"sh "ls -l"}}}}

2、报错现象

image-20230322064440110

image-20230322064537626

3、正确代码

  • 流水线代码

image-20230322064713764

groovy
currentBuild.displayName ="Devops:commitID"currentBuild.description ="Branch:master"pipeline {agent anystages {stage('Hello') {steps {echo 'Hello World'echo "${VERSION}"echo "${env.VERSION}"echo "${params.VERSION}"sh "ls -l"}}}}
  • 构建

image-20230322064748264

image-20230322064808122

TS:解决Jenkins构建时间显示不正确的问题-2022.5.14(已解决)

image-20220514104955168

1、问题现象

jenkins构建时间显示有问题

image-20220514104602386

2、解决办法

解决办法:

点击管理jenkins--批命令处理--输入 :

bash
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')

image-20220514104652691

image-20220514104708104

3、验证

重新构建,时间显示正确

image-20220514104734730

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 语雀

https:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新